// 严格模式下null和undefined赋值给其它类型值
let str1 = "lison";
// str1 = null; // error 不能将类型“null”分配给类型“string”
let strNull: string | null = "lison"; // 这里你可以简单理解为，string | null即表示既可以是string类型也可以是null类型
strNull = null; // right
// strNull = undefined; // error 不能将类型“undefined”分配给类型“string | null”

// 可选参数和可选属性
// 如果开启了 strictNullChecks，可选参数会被自动加上|undefined
const sum1 = (x: number, y?: number) => {
  return x + (y || 0);
};
sum1(1, 2); // 3
sum1(1); // 1
sum1(1, undefined); // 1
// sum1(1, null); // error Argument of type 'null' is not assignable to parameter of type 'number | undefined'

// !显示赋值断言
// 当我们开启 strictNullChecks 时，有些情况下编译器是无法在我们声明一些变量前知道一个值是否是 null 的，所以我们需要使用类型断言手动指明该值不为 null
function getSplicedStr(num: number | null): string {
  function getLength(prefix: string) {
    return prefix + num!.toFixed().toString();
  }
  num = num || 0.1;
  return getLength("lison");
}
